home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / HDX350 / ZERO.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-09  |  3.3 KB  |  135 lines

  1. /* zero.c */
  2.  
  3. /* 16-Mar-88  ml.    split up assist.c into this and markbad.c    */
  4. /* 11-Dec-87  ml.    added BSL concept to zero().            */
  5. /* 01-Nov-88  jye.  change add codes so that can be used for MS-DOS */
  6.  
  7.  
  8. #include "osbind.h"
  9. #include "obdefs.h"
  10. #include "mydefs.h"
  11. #include "part.h"
  12. #include "bsl.h"
  13. #include "addr.h"
  14.  
  15.  
  16. extern long gbslsiz();
  17. extern long bslsiz;
  18. extern BYTE *bsl;
  19. extern long ratio;
  20.  
  21.  
  22. /*           
  23.  * Zero logical dev
  24.  *
  25.  */
  26. zero(ldev)
  27. int ldev;
  28. {
  29.     UWORD pdev,ndirs, fatsiz;
  30.     UWORD bps;
  31.     SECTOR fat0, data, size, dummy=0;
  32.     char bs[512];
  33.     char *newbs;
  34.     BOOT *boot;
  35.     int  bootsiz, i, ret;
  36.     
  37.     if ((ret = rdsects(ldev, 1, bs, (SECTOR)0)) != 0) {
  38.         if (tsterr(ret) != OK)
  39.             err(bootread);
  40.         return ERROR;
  41.     }
  42.  
  43.     /*
  44.      * Zero file system's boot sector, FAT and DIR sectors.
  45.      */
  46.     boot = (BOOT *)bs;
  47.     gw((UWORD *)&boot->b_ndirs[0], &ndirs);
  48.     gw((UWORD *)&boot->b_spf[0], &fatsiz);
  49.     gw((UWORD *)&boot->b_bps[0], &bps);
  50.     ratio = (long)(bps / BPS);
  51.     size = (long)BPS * ratio;
  52.     if ((newbs = (char *)Malloc(size)) <= 0)    {
  53.         err(nomemory);
  54.         if (newbs > 0) Mfree((long)newbs);
  55.         return ERROR;
  56.     }
  57.     
  58.     if ((ret = zerosect(ldev, (SECTOR)0, 
  59.                     (1 + fatsiz*2 + ndirs*BPDIR/bps)*((UWORD)ratio))) != 0) {
  60.         if (tsterr(ret) != OK)
  61.             err(hdrwrite);
  62.         return ERROR;
  63.     }
  64.          
  65.  
  66.     /* Put boot information into new boot sector */
  67.     if ((ret = rdsects(ldev, (UWORD)ratio, newbs, (SECTOR)0)) != 0) {
  68.         if (tsterr(ret) != OK)
  69.             err(bootread);
  70.         return ERROR;
  71.     }
  72.     bootsiz = sizeof(BOOT);        
  73.     for (i = 0; i < bootsiz; i++)
  74.         newbs[i] = bs[i];
  75.     
  76.     /* put the last long word data into the new boot sector */
  77.     *(long *)&newbs[508] = *(long *)&bs[508];
  78.  
  79.     /* Write boot information back to disk */
  80.     if ((ret = wrsects(ldev, (UWORD)ratio, newbs, (SECTOR)0)) != 0) {
  81.         if (tsterr(ret) != OK)
  82.             err(bootwrit);
  83.         return ERROR;
  84.     }
  85.         
  86.     /*
  87.      * Make first 2 entries in FATs more IBM-like.
  88.      */
  89.     if ((ret = rdsects(ldev,(UWORD)ratio,newbs,ratio)) != 0) {/* read FAT 0 */
  90.         return ERROR;
  91.     }
  92.     *(UWORD *)&newbs[0] = 0xf8ff;
  93.     *(UWORD *)&newbs[2] = 0xffff;
  94.     
  95.     /* write FAT 0 and FAT 1 */
  96.     if ((ret = wrsects(ldev, (UWORD)ratio, newbs, ratio)) != 0
  97.     || (ret = wrsects(ldev, (UWORD)ratio, newbs, 
  98.                 (SECTOR)((1+fatsiz)*ratio))) != 0) {
  99.     if (tsterr(ret) != OK)
  100.         err(fatwrite);
  101.     return ERROR;
  102.     }
  103.         
  104.     pdev = ldev;
  105.     log2phys(&pdev, &dummy);
  106.     
  107.     /* Get size of BSL */
  108.     if ((bslsiz = gbslsiz(pdev)) > 0L) {
  109.         /* Allocate memory for existing BSL */
  110.         if ((bsl = (BYTE *)mymalloc((int)bslsiz << 9)) <= 0)
  111.             return err(nomemory);
  112.             
  113.         /* Read in BSL */
  114.         if ((dummy = rdbsl(pdev)) != OK) {
  115.             free(bsl);
  116.             if (dummy = INVALID)
  117.                 err(cruptbsl);
  118.             return ERROR;
  119.         }
  120.         
  121.     fat0 = ratio;
  122.     data = (SECTOR)1 + (SECTOR)fatsiz*2 + (SECTOR)(ndirs*BPDIR/bps);
  123.     
  124.         /* Mark Vendor or User Bad Sectors into FAT */
  125.     if (bsl2fat(ldev, fat0, fatsiz*((UWORD)ratio), data*ratio, MEDIA) != OK) {
  126.             free(bsl);
  127.             return ERROR;
  128.         }
  129.     free(bsl);
  130.     }
  131.     if (newbs > 0)    Mfree((long)newbs);
  132.     return OK;
  133. }
  134.  
  135.